﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;

namespace KduneeShaders
{
    /// <summary>
    /// Shader animowanej magicznej powłoki
    /// </summary>
    public class MagicShader : GeneralShader
    {
        /// <summary>
        /// Połyskliwość - wykładnik w równaniu na specular
        /// </summary>
        public float Shininess
        {
            get { return this.Parameters["shininess"].GetValueSingle(); }
            set { this.Parameters["shininess"].SetValue(value); }
        }

        /// <summary>
        /// Prędkość zmian
        /// </summary>
        public float MagicRate
        {
            get { return this.Parameters["magicRate"].GetValueSingle(); }
            set { this.Parameters["magicRate"].SetValue(value); }
        }

        /// <summary>
        /// Skala magicznej powłoki
        /// </summary>
        public float MagicScale
        {
            get { return this.Parameters["magicScale"].GetValueSingle(); }
            set { this.Parameters["magicScale"].SetValue(value); }
        }

        /// <summary>
        /// Kolor magicznej powłoki
        /// </summary>
        public Vector4 MagicColor
        {
            get { return this.Parameters["magicColor"].GetValueVector4(); }
            set { this.Parameters["magicColor"].SetValue(value); }
        }

        /// <summary>
        /// Konstruktor shadera
        /// </summary>
        /// <param name="content">Menadżer danych</param>
        /// <param name="diffuse">Tekstura diffuse</param>
        public MagicShader(ContentManager content, Texture2D diffuse)
            : base(content.Load<Effect>(ShadersConfig.SHADERS_PATH + @"magic"))
        {
            Diffuse = diffuse;
            this.CurrentTechnique = this.Techniques[0];
        }

        /// <summary>
        /// Aktualizacja shadera
        /// </summary>
        /// <param name="delta">Ilość czasu, jaki upłynął</param>
        /// <param name="eye">Pozycja obserwatora</param>
        /// <param name="light">Pozycja światła</param>
        public override void Update(float delta, Vector3 eye, Vector3 light)
        {
            this.Parameters["time"].SetValue(this.Parameters["time"].GetValueSingle() + delta);
            base.Update(delta, eye, light);
        }
    }
}
